package com.api.weavernorth.humanresource;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.weavernorth.util.Logger4jUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import sun.misc.BASE64Encoder;
import weaver.general.BaseBean;
import weaver.general.Util;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.Iterator;

/**
 * Created by guo_zy on 2021/3/31.
 * 根据身份证号查询员工信息
 */
@Path("/weavernorth/humanresource")
public class getEmpInfo extends HttpServlet {
    private Logger log = Logger4jUtil.getLoggerByName("/api/getEmpInfo/");
    @GET
    @Path("/getEmpInfo")
    @Produces(MediaType.TEXT_PLAIN)
    public String getEmpInfoFromId(@Context HttpServletRequest request, @Context HttpServletResponse response) {
        //人员id
        String strUserid= Util.null2String(request.getParameter("userid"));
        String fhz="";
        //拼接xml
        StringBuffer xml = new StringBuffer("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:sap-com:document:sap:rfc:functions\">");
        xml.append("<soapenv:Header/>");
        xml.append("<soapenv:Body>");
        xml.append("<urn:ZHRI_089>");
        xml.append("<I_ICNUM>"+strUserid+"</I_ICNUM>");
        xml.append("<RETURN>");
        xml.append("<!--Zero or more repetitions:-->");
        xml.append("<item>");
        xml.append("<TYPE></TYPE>");
        xml.append("<ID></ID>");
        xml.append("<NUMBER></NUMBER>");
        xml.append("<MESSAGE></MESSAGE>");
        xml.append("<LOG_NO></LOG_NO>");
        xml.append("<LOG_MSG_NO></LOG_MSG_NO>");
        xml.append("<MESSAGE_V1></MESSAGE_V1>");
        xml.append("<MESSAGE_V2></MESSAGE_V2>");
        xml.append("<MESSAGE_V3></MESSAGE_V3>");
        xml.append("<MESSAGE_V4></MESSAGE_V4>");
        xml.append("<PARAMETER></PARAMETER>");
        xml.append("<ROW></ROW>");
        xml.append("<FIELD></FIELD>");
        xml.append("<SYSTEM></SYSTEM>");
        xml.append("</item>");
        xml.append("</RETURN>");
        xml.append("<T_DATA>");
//        xml.append("<!--Zero or more repetitions:-->");
//        xml.append("<item>");
//        xml.append("<PERNR></PERNR>");
//        xml.append("<ENAME></ENAME>");
//        xml.append("<STAT2></STAT2>");
//        xml.append("<BEGDA></BEGDA>");
//        xml.append("<ENDDA></ENDDA>");
//        xml.append("<PLANS></PLANS>");
//        xml.append("<ZRZSJ></ZRZSJ>");
//        xml.append("<WERKS></WERKS>");
//        xml.append("<PERSG></PERSG>");
//        xml.append("<PERSK></PERSK>");
//        xml.append("<ABKRS></ABKRS>");
//        xml.append("<ANSVH></ANSVH>");
//        xml.append("<GESCH></GESCH>");
//        xml.append("<GBDEP></GBDEP>");
//        xml.append("<NATIO></NATIO>");
//        xml.append("<FAMST></FAMST>");
//        xml.append("<HUKOT></HUKOT>");
//        xml.append("<RACKY></RACKY>");
//        xml.append("<ICNUM></ICNUM>");
//        xml.append("<USEFR></USEFR>");
//        xml.append("<USETO></USETO>");
//        xml.append("<ZZZZZ></ZZZZZ>");
//        xml.append("<PCODE></PCODE>");
//        xml.append("<GBORT></GBORT>");
//        xml.append("<ZXXDZ></ZXXDZ>");
//        xml.append("<ZRYLB></ZRYLB>");
//        xml.append("<ZGB></ZGB>");
//        xml.append("<ZSP></ZSP>");
//        xml.append("<ZSJHM></ZSJHM>");
//        xml.append("<ZJTDH></ZJTDH>");
//        xml.append("<ZZZQQ></ZZZQQ>");
//        xml.append("<ZZZWX></ZZZWX>");
//        xml.append("<ZZZYX></ZZZYX>");
//        xml.append("<ZRXRQ></ZRXRQ>");
//        xml.append("<ZBYRQ></ZBYRQ>");
//        xml.append("<SLART></SLART>");
//        xml.append("<INSTI></INSTI>");
//        xml.append("<FACH3></FACH3>");
//        xml.append("<INSAT></INSAT>");
//        xml.append("<CTNUM></CTNUM>");
//        xml.append("<CTTYP></CTTYP>");
//        xml.append("<CTBEG></CTBEG>");
//        xml.append("<CTEDT></CTEDT>");
//        xml.append("<ZCJGZ></ZCJGZ>");
//        xml.append("<ZJRJT></ZJRJT>");
//        xml.append("<ZJRGS></ZJRGS>");
//        xml.append("<ZSPZCLS></ZSPZCLS>");
//        xml.append("<ZSPZCJB></ZSPZCJB>");
//        xml.append("<ZQPZCB></ZQPZCB>");
//        xml.append("<ZQPZCJB></ZQPZCJB>");
//        xml.append("<GBDAT></GBDAT>");
//        xml.append("<BTRTL></BTRTL>");
//        xml.append("<SCHKZ></SCHKZ>");
//        xml.append("<SLABS></SLABS>");
//        xml.append("<ZXM></ZXM>");
//        xml.append("<ZLXYS></ZLXYS>");
//        xml.append("<PROZT></PROZT>");
//        xml.append("<ICNUM1></ICNUM1>");
//        xml.append("<BUKRS></BUKRS>");
//        xml.append("<ZWJH1></ZWJH1>");
//        xml.append("<ZWJH2></ZWJH2>");
//        xml.append("<ZWJH3></ZWJH3>");
//        xml.append("<DAT02></DAT02>");
//        xml.append("<DAT03></DAT03>");
//        xml.append("<ZJHLZSJ></ZJHLZSJ>");
//        xml.append("<PRBZT></PRBZT>");
//        xml.append("<PRBEH></PRBEH>");
//        xml.append("<KOSTL></KOSTL>");
//        xml.append("<PLSTX></PLSTX>");
//        xml.append("</item>");
        xml.append("</T_DATA>");
        xml.append("</urn:ZHRI_089>");
        xml.append("</soapenv:Body>");
        xml.append("</soapenv:Envelope>");
        log.info("chuan:"+xml.toString());
        fhz=toServices(xml.toString()).toString();
        log.info("fanhui:"+fhz);
        return fhz;
    }

    /**
     * 传送SAP返回JSON对象
     *
     * @return
     */
    public JSONObject toServices(String requestXml) {

        BaseBean aa = new BaseBean();
        aa.writeLog("请求的requestXml：" + requestXml);
        //获取properties中接口地址值
        String strRealUrl = Util.null2String(aa.getPropValue("personnel-erdos", "ryidurl"));
        aa.writeLog("接口地址值：" + strRealUrl);
        //调用方法传入的参数
        String strEncoding = "UTF-8";
        String result = null;
        StringBuffer strTest = new StringBuffer();
        strTest.append("推送的所有明细表数据共有如下错误：（按错误个数排序）：");
        //区分是否全部是成功的
        String strFlag = "true";
        //sap返回的所有信息
        JSONArray jsonArray = new JSONArray();
        JSONArray jsonResult = new JSONArray();
        JSONObject returnResult=new JSONObject();
        try {
            result = sendPost(strRealUrl, requestXml, strEncoding,log);

            //解析result返回的xml
            log.info("SAP响应的结果xml：" + result);
            //获取返回结果
            Document doc = null;
            try {
                doc = DocumentHelper.parseText(result.toString());
                //判断失败成功与否的字段
                Iterator<Element> its2 = doc.selectNodes("//TYPE").iterator();
                //错误信息
                Iterator<Element> its3 = doc.selectNodes("//MESSAGE").iterator();
                //获取字段信息
                Iterator<Element> its4 = doc.selectNodes("//T_DATA/item/*").iterator();

                while (its4.hasNext()) {
                    //获取人员信息并返回
                    JSONObject jsonObject = new JSONObject();
                    Element element = its4.next();
                    String strFlagSAP = element.getName();
                    String strMsg = element.getText();
                    jsonObject.put(strFlagSAP, strMsg);
                    jsonArray.add(jsonObject);
                }
                while (its2.hasNext()) {
                    //因为SAP返回两条错误消息,一条错误结果,一条错误原因,此处只取错误原因
                    //封存返回数据
                    JSONObject jsonObject = new JSONObject();
                    Element element = its2.next();
                    Element element3 = its3.next();
                    if (element3.getText().contains("数据写入失败")){
                        strFlag="false";
                    }
                    String strFlagSAP = element.getText();
                    String strMsg = element3.getText();
                    jsonObject.put("flag", strFlagSAP);
                    jsonObject.put("mess", strMsg);
                    jsonArray.add(jsonObject);

                }
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("result",strFlag);
                jsonResult.add(jsonObject);
                returnResult.put("res",jsonArray);
                returnResult.put("result",jsonResult);
            } catch (Exception e) {
                log.info("传送至SAP发生异常,异常信息为：" + e.toString());
                e.printStackTrace();
            }


        } catch (Exception e) {
            log.info("传送至SAP发生异常,异常信息为：" + e.toString());
            e.printStackTrace();
        }
        log.info("fhzis:"+returnResult);
        return returnResult;
    }
    /**
     * 推送方法
     *
     * @param strUrl
     * @param strRequestXml
     * @param strEncoding
     * @return
     * @throws IOException
     */
    public static String sendPost(String strUrl, String strRequestXml, String strEncoding,Logger log) throws IOException {
        log.info("请求地址=" + strUrl);
        log.info("请求xml=" + strRequestXml);
        //基础类
        BaseBean bb = new BaseBean();

        String strBody = "";
        //创建httpclient对象
        CloseableHttpClient client = HttpClients.createDefault();

        //创建post方式请求对象
        try {
            HttpPost httpPost = new HttpPost(strUrl);

            //装填参数
            StringEntity stringEntity = new StringEntity(strRequestXml, "utf-8");
            //log.info("请求xml=" + strRequestXml);
            //设置参数到请求对象中
            httpPost.setEntity(stringEntity);
            //获取用户名
            String strUsername = Util.null2String(bb.getPropValue("personnel-erdos", "username"));
            //获取密码
            String strPassword = Util.null2String(bb.getPropValue("personnel-erdos", "password"));
            //sap的接口需验证
            String strValue = "Basic " + (new BASE64Encoder().encode((strUsername + ":" + strPassword).getBytes()));
            httpPost.setHeader("Authorization", strValue);
            httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");

            //执行请求操作，并拿到结果（同步阻塞）
            CloseableHttpResponse response = client.execute(httpPost);
            //获取结果实体
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                //按指定编码转换结果实体为String类型
                strBody = EntityUtils.toString(entity, strEncoding);
                // log.info("返回结果=" + strBody);
            }
            EntityUtils.consume(entity);
            //释放链接
            response.close();
        } catch (Exception e) {
            log.info("异常捕获=" + e);
        }
        return strBody;
    }
}
